home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / presto / presto10.lha / src / synchro.h < prev    next >
C/C++ Source or Header  |  1991-12-11  |  1KB  |  70 lines

  1. #ifndef __presto__synchro_h__
  2. #define __presto__synchro_h__
  3.  
  4. //
  5. // Synchronization objects.
  6. //
  7.  
  8.  
  9. class SynchroObject : public Object {
  10.     Spinlock    *so_lock;
  11.     ThreadQUnlocked    *so_waiting;
  12. public:
  13.     SynchroObject(int t, char *name=0);
  14.     ~SynchroObject();
  15.     inline void remember(Thread* t);
  16.     inline Thread* recall();
  17.     inline void lock();            // always inline
  18.     inline void unlock();            // cyclic dependencies!
  19.     inline ThreadQUnlocked    *waitingQueue();
  20.     virtual void print(ostream& = cout);
  21. };
  22.  
  23. inline void
  24. SynchroObject::lock()
  25. {    
  26.     register Spinlock *sp = so_lock;
  27.      sp->lock();
  28. }
  29.  
  30. inline void
  31. SynchroObject::unlock()
  32. {
  33.     register Spinlock *sp = so_lock;
  34.     sp->unlock();
  35. }
  36.  
  37.  
  38.  
  39. inline
  40. Thread*
  41. SynchroObject::recall()
  42. {
  43.     register ThreadQUnlocked *soq = so_waiting;
  44.     return soq->get();
  45. }
  46.  
  47. inline
  48. void
  49. SynchroObject::remember(Thread *t)
  50. {
  51.     register ThreadQUnlocked *soq = so_waiting;
  52.     t->orstate(TS_BLOCKED);
  53.     //
  54.     // at this point, we are both blocked AND running.  We have been
  55.     // blocked as far as the queue is concerned, but we still need
  56.     // to sleep ourselves before we can be considered not running
  57.     //
  58.     soq->append(t);
  59. }
  60.  
  61. inline
  62. ThreadQUnlocked*
  63. SynchroObject::waitingQueue()
  64. {
  65.     return so_waiting;
  66. }
  67.  
  68.  
  69. #endif /* __presto__synchro_h__ */
  70.